/*
  类的其他书写方式
    1. 可计算的成员名

    2. getter和setter
      Object.defineProperty可定义某个对象成员属性的读取和设置

    3. 静态成员
      构造函数本是的成员, 使用static定义的成员即为静态成员

    4. 字段初始化器（ES7）
      1. 使用static的字段初始化器，添加的静态成员
      2. 没有使用static的字段初始化器，添加的成员位于对象上
      3. 箭头函数在字段初始化器位置上，指向当前对象

    5. 类表达式
      const A = class {
      
      }
      const a = new A()
      类的表达式本质就是函数

    6. 装饰器（Decorator）
      横切关注点，装饰器本质就是一个函数
*/
/* const printName = "print";
class Animal {
  // 字段初始化器
  height = 100;
  constructor(type, name, age, sex) {
    this.type = type;
    this.name = name;
    this.age = age;
    this.sex = sex;
    // 字段初始化器最终都会在constructor中调用
    // test = () => {
    //   这里的thiis为当前实例对象
    //   console.log(this.type)
    // }
  }
  // 可计算的成员名
  [printName]() {
    console.log(`${this.type} ${this.name} ${this.age} ${this.sex}`);
  }
  // getter和setter
  get age() {
    return this._age;
  }
  set age(age) {
    if (typeof age !== "number") {
      throw new TypeError("age property must be a number");
    }
    if (age < 0) {
      age = 0;
    } else if (age > 1000) {
      age = 1000;
    }
    this._age = age;
  }

  static test = "animal";
  static method() {
    console.log("static method");
  }
  test = () => {
    console.log(this.type);
  };
} */

class Test {
  @Obsolete
  print() {
    console.log("print方法");
  }
}

function Obsolete(target, methodName, descriptor) {
  // console.log(target, methodName, descriptor);
  const oldFunc = descriptor.value;
  descriptor.value = function (...args) {
    console.warn(`${methodName}方法已过时`);
    oldFunc.apply(this, args);
  };
}

const t = new Test();
t.print();
